/*
 * MensajeNuevoAnillo.h
 *
 *  Created on: Mar 13, 2010
 *      Author: jgrande
 */

#ifndef MENSAJENUEVOANILLO_H_
#define MENSAJENUEVOANILLO_H_

#include <list>
#include <sstream>

#include "Mensaje.h"

#include "../../Framework/Common/File.h"
#include "../../Framework/IO/log.h"

#include "../Common/CommonTypes.h"

using std::list;

using middleware::common::Direccion;
using framework::io::logger;

namespace middleware {
namespace common {

/**
 * Mensaje enviado a los emisores para indicarles que fueron incorporados
 * a un anillo.
 */
class MensajeNuevoAnillo: public middleware::Mensaje {

	/**
	 * Le indica al emisor si es él quien debe iniciar la circulación del token.
	 */
	uint8_t primero;

	/**
	 * Direcciones de los receptores.
	 */
	list<Direccion> receptores;

	/**
	 * Sucesor en el anillo.
	 */
	Direccion sucesor;

public:

	MensajeNuevoAnillo();

	virtual ~MensajeNuevoAnillo();

	virtual std::string toString() const;

	virtual size_t save (int fd) const;

	virtual size_t load (int fd);

	virtual size_t saveToArray (uint8_t* arr) const;

	virtual size_t loadFromArray (const uint8_t* arr);

	void setPrimero(uint8_t primero) { this->primero = primero; }

	uint8_t getPrimero() const { return this->primero; }

	void setSucesor(Direccion sucesor) { this->sucesor = sucesor; }

	Direccion getSucesor() const  { return this->sucesor; }

	void setReceptores(const list<Direccion>& receptores) {
		setTamanio(sizeof(primero) + sizeof(sucesor) + sizeof(size_t)
				+ sizeof(Direccion) * receptores.size());
		this->receptores = receptores;
	}

	const list<Direccion>& getReceptores() const { return this->receptores; }
};

}
}

#endif /* MENSAJENUEVOANILLO_H_ */
